package com.smart.community.user.config;

import cn.dev33.satoken.stp.StpInterface;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.List;

/**
 * 用户模块Sa-Token配置类
 * 
 * 功能说明：
 * 1. 实现Sa-Token权限和角色接口
 * 2. 直接从Sa-Token获取用户权限和角色信息
 * 3. 支持认证接口的权限控制
 * 
 * 架构设计：
 * - 遵循"智慧社区微服务架构总览.md"的权限控制分层架构
 * - 网关负责Token验证，服务负责数据权限控制
 * - 认证接口不需要Sa-Token验证，由网关统一处理
 * - 完全使用Sa-Token，移除UserContext依赖
 * 
 * @author Wu.Liang
 * @since 2025-01-30
 * @updated 2025-01-30 - 移除UserContext依赖，完全使用Sa-Token
 */
@Slf4j
@Component
@Primary
public class UserSaTokenConfig implements StpInterface {

    /**
     * 返回指定账号id所拥有的权限码集合
     */
    @Override
    public List<String> getPermissionList(Object loginId, String loginType) {
        log.debug("获取用户权限列表: loginId={}, loginType={}", loginId, loginType);
        
        try {
            // 直接从Sa-Token Session获取权限信息
            Object permissionList = cn.dev33.satoken.stp.StpUtil.getSession().get("permissionList");
            if (permissionList instanceof List) {
                List<String> permissions = (List<String>) permissionList;
                log.debug("从Sa-Token Session获取权限列表: {}", permissions);
                return permissions;
            }
        } catch (Exception e) {
            log.warn("从Sa-Token Session获取权限失败: {}", e.getMessage());
        }
        
        // 如果无法获取权限，返回空列表
        log.warn("无法获取用户权限，返回空列表");
        return new ArrayList<>();
    }

    /**
     * 返回指定账号id所拥有的角色标识集合
     */
    @Override
    public List<String> getRoleList(Object loginId, String loginType) {
        log.debug("获取用户角色列表: loginId={}, loginType={}", loginId, loginType);
        
        try {
            // 直接从Sa-Token Session获取角色信息
            Object roleList = cn.dev33.satoken.stp.StpUtil.getSession().get("roleList");
            if (roleList instanceof List) {
                List<String> roles = (List<String>) roleList;
                log.debug("从Sa-Token Session获取角色列表: {}", roles);
                return roles;
            }
        } catch (Exception e) {
            log.warn("从Sa-Token Session获取角色失败: {}", e.getMessage());
        }
        
        // 如果无法获取角色，返回空列表
        log.warn("无法获取用户角色，返回空列表");
        return new ArrayList<>();
    }
}
